home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / xpicw / xpicw110.lzh / FPIC / SYS_SPIC.has < prev   
Encoding:
Text File  |  1997-04-10  |  17.4 KB  |  745 lines

  1. *///////*///////*///////*///////*///////*///////*///////*///////
  2. *
  3. *    SYS_SPIC.HAS v1.5    BY 鳳 幽玄 1995
  4. *
  5. **///////*///////*///////*///////*///////*///////*///////*///////
  6. *    注意:
  7. *
  8. *    ・HAS V3.0 以上でアセンブルしてください。
  9. *
  10. *    ・_Fpic_disp:展開先がグラフィックRAMなどの場合は、
  11. *     スーパーバイザ・モードにしてからコールしてください。
  12. *     また、画面モードも自前で設定してください。
  13. *
  14. *    ・_Fpic_disp は、スタックワーク1Kbyte強 使用します。
  15. *
  16. *///////*///////*///////*///////*///////*///////*///////*///////
  17.  
  18.         include    iocscall.mac
  19.         include    doscall.mac
  20.         include    sys_fpic.mac
  21.  
  22.         .xdef    _Fpic_load
  23.         .xdef    _Fpic_keep
  24.         .xdef    _Fpic_disp
  25.         .xdef    _Fpic_free
  26.         .xdef    _Fpic_set_buf
  27.  
  28.         .text
  29.  
  30. *///////*///////*///////*///////*///////*///////*///////
  31. *    一括処理する
  32. *///////*///////*///////*///////*///////*///////*///////
  33. *    int Fpic_load(FileNamePtr,x,y)
  34. *    ret:d0.l =  0 普通に終了
  35. *           -1 読めなかった
  36. *           -2 未対応データ
  37. *           -3 メモリ不足
  38. *///////*///////*///////*///////*///////*///////*///////
  39. _Fpic_load:    movem.l    d1-d2/a0,-(sp)
  40.  
  41.         movea.l    4*4(sp),a0            *a0.l = File name
  42.         move.l    4*5(sp),d1            *d1.l = X
  43.         move.l    4*6(sp),d2            *d2.l = Y
  44.  
  45.         pea    (a0)                *┐メモリに読み込む
  46.         bsr    _Fpic_keep            *│
  47.         addq.w    #4,sp                *│
  48.         tst.l    d0                *│
  49.         bmi    9f                *│
  50.         movea.l    d0,a0                *┘
  51.  
  52.         move.l    d2,-(sp)            *┐読み込んだのを表示
  53.         move.l    d1,-(sp)            *│
  54.         pea    (a0)                *│
  55.         bsr    _Fpic_disp            *│
  56.         lea    12(sp),sp            *┘
  57.  
  58.         pea    (a0)                *┐メモリ解放
  59.         bsr    _Fpic_free            *│
  60.         addq.w    #4,sp                *┘
  61.  
  62.         moveq.l    #0,d0                * 無事おわり
  63.  
  64. 9:        movem.l    (sp)+,d1-d2/a0
  65.         rts
  66.  
  67. *///////*///////*///////*///////*///////*///////*///////
  68. *    メモリを確保してデータを読み込む
  69. *///////*///////*///////*///////*///////*///////*///////
  70. *    int Fpic_keep(FileNamePtr)
  71. *    ret:d0.l = BufPtr
  72. *           -1 読めなかった
  73. *           -2 未対応データ(.PIC 形式ではない)
  74. *           -3 メモリ不足
  75. *           -4 未対応データ(32768/65536 色 .PIC でない)
  76. *///////*///////*///////*///////*///////*///////*///////
  77.  
  78. pmd_tbl:    dc.b    $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
  79.         dc.b    $ff,$ff,$ff,$ff,$ff,$ff,$02,$03
  80.  
  81. _Fpic_keep:    movem.l    d1-d7/a0-a6,-(sp)
  82.  
  83.         move.l    4*15(sp),a0            * a0.l = ファイル名へのポインタ
  84.  
  85.         clr.w    -(sp)                *┐ファイルオープン
  86.         pea    (a0)                *│
  87.         DOS    _OPEN                *│
  88.         addq.l    #6,sp                *│
  89.         move.l    d0,d1                *│
  90.         bmi    9f                *┘
  91.  
  92.         move.w    d1,-(sp)            *┐ちゃんと'PIC'データですか?
  93.         DOS    _FGETC                *│
  94.         cmpi.b    #'P',d0                *│
  95.         bne    8f                *│
  96.         DOS    _FGETC                *│
  97.         cmpi.b    #'I',d0                *│
  98.         bne    8f                *│
  99.         DOS    _FGETC                *│
  100.         cmpi.b    #'C',d0                *│
  101.         bne    8f                *┘
  102.  
  103.         moveq.l    #0,d6                *d6.l = X<<16 + Y
  104.         move.l    #$00_00_08_00,d7        *d7.l = flag1_flag2_SCR_PICT
  105.         bsr    comment_chk            *
  106.  
  107. @@:        DOS    _FGETC                *┐0飛ばし
  108.         tst.b    d0                *│
  109.         bne    @b                *┘
  110.  
  111.         DOS    _FGETC                *┐$0000?
  112.         tst.b    d0                *│
  113.         bne    8f                *│
  114.         DOS    _FGETC                *│
  115.         tst.b    d0                *│
  116.         bne    8f                *┘
  117.  
  118.         DOS    _FGETC                *┐使用色bit数
  119.         move.b    d0,d3                *│
  120.         lsl.w    #8,d3                *│
  121.         DOS    _FGETC                *│
  122.         move.b    d0,d3                *┘
  123.         subq.w    #1,d3                *┐使用色bit数/$0001~$0010
  124.         cmpi.w    #16,d3                *│    を
  125.         bcc    6f                *│PIC・TYPEに変換
  126.         move.b    pmd_tbl(pc,d3.w),d3        *│
  127.         bmi    6f                *│    02:32768色
  128.         or.w    d3,d7                *┘    03:65536色
  129.  
  130.         moveq.l    #0,d5                *┐サイズ
  131.         moveq.l    #4-1,d3                *│
  132. 1:        lsl.l    #8,d5                *│
  133.         DOS    _FGETC                *│
  134.         move.b    d0,d5                *│
  135.         dbra    d3,1b                *┘d5.l = sizeX<<16 + sizeY
  136.  
  137.         move.l    d0,d3                *┐
  138.         swap    d3                *│横size check
  139.         cmpi.w    #512,d3                *│
  140.         bhi    8f                *┘
  141.         cmpi.w    #512,d5                *┐縦size check
  142.         bhi    8f                *┘
  143.  
  144.         move.w    #1,-(sp)            *┐現在のポインタ位置
  145.         clr.l    -(sp)                *│
  146.         move.w    d1,-(sp)            *│
  147.         DOS    _SEEK                *│
  148.         add.w    #8,sp                *│
  149.         move.l    d0,d2                *┘
  150.  
  151.         move.w    #2,-(sp)            *┐全サイズを調べる
  152.         clr.l    -(sp)                *│
  153.         move.w    d1,-(sp)            *│
  154.         DOS    _SEEK                *│
  155.         add.w    #8,sp                *│
  156.         move.l    d0,d3                *┘
  157.         sub.l    d2,d3                *d3.l = 圧縮データ部のサイズ
  158.  
  159.         clr.w    -(sp)                *┐ポインタを頭に戻す
  160.         move.l    d2,-(sp)            *│
  161.         move.w    d1,-(sp)            *│
  162.         DOS    _SEEK                *│
  163.         add.w    #8,sp                *┘
  164.  
  165.         move.l    #fpw_size,d2            *┐ヘッダサイズ
  166.         addq.l    #4,d2                *┘ヘッダサイズ+念のための4バイト
  167.  
  168.         move.l    d3,-(sp)            *┐メモリ確保
  169.         add.l    d2,(sp)                *│ヘッダ分多めに取る
  170.         DOS    _MALLOC                *│
  171.         addq.w    #4,sp                *│
  172.         move.l    d0,a0                *│a0.l = データのアドレス
  173.         tst.l    d0                *│
  174.         bmi    7f                *┘
  175.  
  176.         move.l    d3,-(sp)            *┐圧縮データ部読み込み
  177.         pea    fpw_size(a0)            *│
  178.         move.w    d1,-(sp)            *│
  179.         DOS    _READ                *│
  180.         lea    10(sp),sp            *┘
  181.  
  182. *        add.l    d3,d2                *┐念のために取った4バイトをクリア
  183. *        clr.l    -4(a0,d2.l)            *┘
  184.  
  185.         move.l    d7,fpw_FLAG1(a0)        *
  186.         move.l    d6,fpw_X(a0)            *
  187.         move.l    d5,fpw_H(a0)            *
  188.         clr.l    fpw_rsv(a0)            *
  189.  
  190.         DOS    _CLOSE                *┐ファイルクローズ
  191.         addq.w    #2,sp                *┘
  192.  
  193.         move.l    a0,d0                *普通に終了
  194.  
  195. @@:        movem.l    (sp)+,d1-d7/a0-a6
  196.         rts
  197.  
  198. 9:        moveq.l    #-1,d0                *┐-1 = 読み込みエラー
  199.         bra    @b                *│
  200.                             *│
  201. 8:        DOS    _CLOSE                *│
  202.         addq.w    #2,sp                *│
  203.         moveq.l    #-2,d0                *│-2 = 対応してないデータ。
  204.         bra    @b                *│(.PIC ではない)
  205.                             *│
  206. 7:        DOS    _CLOSE                *│
  207.         addq.w    #2,sp                *│
  208.         moveq.l    #-3,d0                *│-3 = メモリ不足
  209.         bra    @b                *│
  210.                             *│
  211. 6:        DOS    _CLOSE                *│
  212.         addq.w    #2,sp                *│
  213.         moveq.l    #-4,d0                *│-4 = 対応してないデータ。
  214.         bra    @b                *┘(32768/65536 色 .PIC でない)
  215.  
  216. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  217. *    MFGED 拡張フォーマット対応のコメント飛ばし
  218. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  219. comment_chk:    move.w    d1,-(sp)            *File Hundle
  220.  
  221.         move.l    #'/MM/',d2            *┐
  222.         moveq.l    #4-1,d3                *│
  223. 1:        rol.l    #8,d2                *│
  224.         DOS    _FGETC                *│/MM/ check
  225.         cmpi.b    #$1a,d0                *│
  226.         beq    9f                *│
  227.         cmp.b    d2,d0                *│
  228.         bne    8f                *│
  229.         dbra    d3,1b                *┘
  230.  
  231. chk_sw:        DOS    _FGETC                *┐
  232.         cmpi.b    #'M',d0                *│頭check
  233.         beq    MM_M                *│
  234.         cmpi.b    #'X',d0                *│
  235.         beq    MM_X                *│
  236.         cmpi.b    #':',d0                *│
  237.         beq    8f                *┘
  238.  
  239. skip_sl:    DOS    _FGETC                *┐スイッチスキップ&NEXT
  240.         cmpi.b    #'/',d0                *│
  241. *        bne    8b                *│by Mitsuky
  242.         bne    skip_sl                *│
  243.         bra    chk_sw                *┘
  244.  
  245. 8:        DOS    _FGETC                *┐通常のコメントすきっぷ
  246.         cmpi.b    #$1a,d0                *│
  247.         bne    8b                *┘
  248.  
  249. 9:        addq.w    #2,sp
  250.         rts
  251.  
  252. MM_M:        DOS    _FGETC
  253.         cmpi.b    #'K',d0
  254.         beq    MM_MK
  255.         cmpi.b    #'Y',d0
  256.         beq    MM_MY
  257.         cmpi.b    #'S',d0
  258.         beq    MM_MS
  259.         cmpi.b    #'H',d0
  260.         bne    skip_sl
  261.         cmpi.b    #'Y',d0
  262.         beq    MM_MY
  263.  
  264. MM_MHY:        bset.l    #24+fpf_MHY,d7
  265.         bra    skip_sl
  266.  
  267. MM_MK:        bset.l    #24+fpf_MK,d7
  268.         bra    skip_sl
  269.  
  270. MM_MY:        bset.l    #24+fpf_MY,d7
  271.         bra    skip_sl
  272.  
  273. MM_MS:        bset.l    #24+fpf_SCR,d7
  274.         DOS    _FGETC
  275.         andi.w    #$00ff,d0
  276.         cmpi.b    #'A',d0
  277.         bcs    1f
  278.         subi.b    #'A'-'0',d0
  279. 1:        subi.b    #'0',d0
  280.         lsl.w    #8,d0
  281.         or.w    d0,d7
  282.         bra    skip_sl
  283.  
  284. MM_X:        DOS    _FGETC
  285.         cmpi.b    #'Y',d0
  286.         beq    MM_XY
  287.         cmpi.b    #'S',d0
  288.         beq    MM_XS
  289.         cmpi.b    #'F',d0
  290.         beq    skip_sl
  291.  
  292. MM_XF:        DOS    _FGETC
  293.         cmpi.b    #'L',d0
  294.         bne    skip_sl
  295.         bset.l    #24+fpf_RS,d7
  296.         bra    skip_sl
  297.  
  298. MM_XS:        DOS    _FGETC
  299.         cmpi.b    #'S',d0
  300.         bne    skip_sl
  301.         bset.l    #24+fpf_SQ,d7
  302.         bra    skip_sl
  303.  
  304. MM_XY:        bset.l    #24+fpf_XY,d7
  305.         moveq.l    #0,d3
  306.         moveq.l    #0,d6
  307.  
  308.         moveq.l    #4-1,d2
  309. 1:        mulu    #10,d6
  310.         DOS    _FGETC
  311.         andi.w    #$00ff,d0
  312.         subi.b    #'0',d0
  313.         add.w    d0,d6
  314.         dbra    d2,1b
  315.         swap    d6
  316.  
  317.         moveq.l    #4-1,d2
  318. 1:        mulu    #10,d3
  319.         DOS    _FGETC
  320.         andi.w    #$00ff,d0
  321.         subi.b    #'0',d0
  322.         add.w    d0,d3
  323.         dbra    d2,1b
  324.         move.w    d3,d6
  325.         bra    skip_sl
  326.  
  327. *///////*///////*///////*///////*///////*///////*///////
  328. *    データを破棄する
  329. *///////*///////*///////*///////*///////*///////*///////
  330. *    int Fpic_free(BufPtr)
  331. *    ret:d0.l =  0 正常終了
  332. *           -1 エラー
  333. *///////*///////*///////*///////*///////*///////*///////
  334. *_Fpic_free:    move.l    4*1(sp),-(sp)            *┐
  335. *        pea    (a4)                *│解放するだけ
  336. *        DOS    _MFREE                *│
  337. *        addq.w    #8,sp                *│
  338.  
  339. _Fpic_free:    move.l    4*1(sp),-(sp)            *┐by Mitsuky
  340.         DOS    _MFREE                *│解放するだけ
  341.         addq.w    #4,sp                *│
  342.         tst.l    d0                *│
  343.         bmi    8f                *┘
  344. 9:        rts
  345. 8:        moveq.l    #-1,d0                *┐まあ、念のためのエラー
  346.         bra    9b                *┘
  347.  
  348. *///////*///////*///////*///////*///////*///////*///////
  349. *    展開先アドレスの指定
  350. *///////*///////*///////*///////*///////*///////*///////
  351. *    void Fpic_free(BufPtr)
  352. *///////*///////*///////*///////*///////*///////*///////
  353. _Fpic_set_buf:    move.l    a0,-(sp)            *┐設定するだけ
  354.         lea    buf_address(pc),a0        *│
  355.         move.l    8(sp),(a0)            *│
  356.         movea.l    (sp)+,a0            *┘
  357.         rts
  358.  
  359. *///////*///////*///////*///////*///////*///////*///////
  360. *    表示する
  361. *///////*///////*///////*///////*///////*///////*///////
  362. *    int Fpic_disp(BufPtr,x,y)
  363. *    ret:d0.l =  0 正常終了
  364. *           -1 エラー(今のところありえない)
  365. *///////*///////*///////*///////*///////*///////*///////
  366.         .offset    0
  367. PR_BUF:        ds.b    1024    *1024    キャッシュバッファ
  368. PIC_TYP:    ds.w    1    *2    PICの色数モード#
  369. PSIZE_X:    ds.w    1    *2    横サイズ
  370. PSIZE_Y:    ds.w    1    *2    縦サイズ
  371. DOWNOFS:    ds.w    1    *2    1段下へ下がる時のアドレス増加分
  372. VRAMADR:    ds.l    1    *4    左上アドレス
  373. WORK_SZ:    ds.l    1    *    <a6>
  374.         ds.l    1    *    <return adr.>
  375. DATA_BUF:    ds.l    1    *    メモリ上のPICデータのポインタ
  376.         ds.w    1    *
  377. LOC_X:        ds.w    1    *    表示座標X
  378.         ds.w    1    *
  379. LOC_Y:        ds.w    1    *    表示座標Y
  380.         .text
  381.  
  382. buf_address:    dc.l    $c00000
  383. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  384. _Fpic_disp:    link    a6,#-WORK_SZ
  385.         movem.l    d1-d7/a0-a6,-(sp)
  386.         lea    -WORK_SZ(a6),a6        *(変なことをやってるようだけど許して)
  387.  
  388.         movea.l    DATA_BUF(a6),a4            *DATA ADDRESS
  389.  
  390.         clr.w    PIC_TYP(a6)            *┐PIC・TYPE
  391.         move.b    fpw_PICT(a4),PIC_TYP+1(a6)    *┘
  392.         move.w    fpw_H(a4),PSIZE_X(a6)        *SIZE_X
  393.         move.w    fpw_V(a4),PSIZE_Y(a6)        *SIZE_Y
  394.         lea    fpw_size(a4),a4            *
  395.  
  396.         move.w    LOC_X(a6),d0            *┐左上アドレスを求める
  397.         add.w    d0,d0                *│
  398.         move.w    LOC_Y(a6),d1            *│
  399.         mulu    #1024,d1            *│
  400.         add.w    d0,d1                *│
  401.         add.l    buf_address(pc),d1        *│
  402.         move.l    d1,VRAMADR(a6)            *┘
  403.  
  404.         move.w    #512,d0                *┐下段左への増加分を求める
  405.         sub.w    PSIZE_X(a6),d0            *│
  406.         add.w    d0,d0                *│
  407.         move.w    d0,DOWNOFS(a6)            *┘
  408.  
  409.         bsr    screen_init            *
  410.         bsr    cache_init            *
  411.         bsr    PicX                *
  412.  
  413.         moveq.l    #0,d0                *
  414.         movem.l    (sp)+,d1-d7/a0-a6
  415.         unlk    a6
  416.         rts
  417.  
  418. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  419. *    展開バッファをクリア
  420. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  421. screen_init:    movem.l    d0-d7/a0-a4,-(sp)
  422.  
  423.         move.l    VRAMADR(a6),a1            *┐
  424.         move.w    PSIZE_Y(a6),d0            *│
  425.         subq.w    #1,d0                *│
  426.         mulu    #1024,d0            *│
  427.         move.w    PSIZE_X(a6),d1            *│
  428.         add.w    d1,a1                *│
  429.         add.w    d1,d0                *│
  430.         add.l    d0,a1                *┘a1.l = 描き始めアドレス
  431.  
  432.         move.w    PSIZE_X(a6),d0            *┐
  433.         subq.w    #1,d0                *│*左端の分を引く
  434.         move.w    d0,d1                *│
  435.         andi.w    #15,d1                *│
  436.         neg.w    d1                *│
  437.         add.w    #15,d1                *│
  438.         add.w    d1,d1                *│
  439.         lea    jp_1(pc,d1.w),a2        *│a2.l = ジャンプ先
  440.         lsr.w    #4,d0                *│
  441.         neg.w    d0                *│
  442.         add.w    #32,d0                *│
  443.         add.w    d0,d0                *│
  444.         add.w    d0,d0                *│
  445.         lea    jp_16(pc,d0.w),a3        *┘a3.l = ジャンプ先
  446.  
  447.         move.w    DOWNOFS(a6),d0            * 書き込みデータ左端
  448.         neg.w    d0                *
  449.         moveq.l    #$0000_0000,d1            *┐書き込みデータ
  450.         move.l    d1,d2                *│
  451.         move.l    d1,d3                *│
  452.         move.l    d1,d4                *│
  453.         move.l    d1,d5                *│
  454.         move.l    d1,d6                *│
  455.         move.l    d1,a0                *│
  456.         move.l    d1,a4                *┘
  457.  
  458.         move.w    PSIZE_Y(a6),d7            *┐縦繰り返し数
  459.         subq.w    #1,d7                *┘
  460.  
  461. @@:        jmp    (a2)                *┐塗りつぶし
  462. jp_1:        .rept    15                *│
  463.         move.w    d1,-(a1)            *│
  464.         .endm                    *│
  465.         jmp    (a3)                *│
  466. jp_16:        .rept    32                *│
  467.         movem.l    d1-d6/a0/a4,-(a1)        *│
  468.         .endm                    *│
  469.         move.w    d0,-(a1)            *│
  470.         adda.w    d0,a1                *│
  471.         dbra    d7,@b                *┘
  472.  
  473.         movem.l    (sp)+,d0-d7/a0-a4
  474.         rts
  475.  
  476. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  477. *    キャッシュ用ワーク初期化
  478. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  479. cache_init:    movem.l    d0-d3/a0,-(sp)
  480.  
  481.         lea    PR_BUF(a6),a0
  482.         moveq.l    #8,d1
  483.         move.w    #1016,d2
  484.         move.w    #1023,d3
  485.         moveq.l    #128-1,d0
  486.  
  487. 1:        clr.w    (a0)+                *
  488.  
  489.         move.w    d1,(a0)+            *next
  490.         addq.w    #8,d1                *
  491.         and.w    d3,d1                *
  492.  
  493.         move.w    d2,(a0)+            *before
  494.         addq.w    #8,d2                *
  495.         and.w    d3,d2                *
  496.  
  497.         addq.w    #2,a0                *dummy
  498.  
  499.         dbra    d0,1b
  500.  
  501.         movem.l    (sp)+,d0-d3/a0
  502.         rts
  503.  
  504. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  505. *    PIC展開
  506. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  507. B_TEST        .macro                    *┐マクロ:1ビットテスト
  508.         .local    BT_00                *│
  509.         dbra    d7,BT_00            *│
  510.         moveq.l    #15,d7                *│
  511.         swap    d6                *一応必要な場合がある
  512.         move.w    (a4)+,d6            *│
  513. BT_00:        btst.l    d7,d6                *│
  514.         .endm                    *┘
  515.  
  516. B_READ        .macro    bitn,reg            *┐マクロ:複数ビット読み込み
  517.         .local    BR_00                *│
  518.         sub.w    bitn,d7                *│
  519.         bcc.s    BR_00                *│
  520.         add.w    a1,d7                *│
  521.         swap    d6                *│
  522.         move.w    (a4)+,d6            *│
  523. BR_00:        move.l    d6,reg                *│
  524.         lsr.l    d7,reg                *│
  525.         .endm                    *┘
  526.  
  527. B_FB        .macro    bitn                *┐マクロ:読まなかったことにする
  528.         addq.w    #bitn,d7            *│
  529.         .endm                    *┘
  530.  
  531. SET_NM3        .macro                    *┐マクロ:数値設定(^_^;
  532.         addq.w    #1,d4                *│
  533.         sub.l    d3,d4                *│
  534.         bcc    PicX_05                *│
  535.         add.l    d3,d4                *│
  536.         bra    PicX_10                *┘
  537.         .endm
  538.  
  539. UpC        =    -1024+2
  540. UpL1        =    -1024-2+2
  541. UpR1        =    -1024+2+2
  542. UpL2        =    -1024-4+2
  543. UpR2        =    -1024+4+2
  544.  
  545. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  546. PJ:        dc.w    PALsel_16-PJ            *┐色数モード毎のジャンプ先オフセット
  547.         dc.w    PALsel_256-PJ            *│
  548.         dc.w    PALsel32768-PJ            *│
  549.         dc.w    PALsel65536-PJ            *┘
  550.  
  551. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  552. PicX:        move.w    PIC_TYP(a6),d0            *┐
  553.         add.w    d0,d0                *│a5 = パレット取得の処理アドレス
  554.         move.w    PJ(pc,d0.w),d0            *│
  555.         lea    PJ(pc,d0.w),a5            *┘
  556.  
  557.         movea.l    VRAMADR(a6),a0            * a0.l = VRAMポインタ
  558.  
  559.         suba.l    a3,a3                * a3.l = キャシュ用
  560.  
  561.         moveq.l    #0,d7                * d7.l = ビットカウンタ
  562.  
  563.         movea.w    #16,a1                * a1.l = #16の代わり
  564.  
  565.         moveq.l    #0,d4                *┐
  566.         move.w    PSIZE_X(a6),d4            *│d4.l = 横サイズカウンタ
  567.         subq.w    #1,d4                *┘
  568.  
  569.         move.w    #UpC,d5                *
  570.         move.l    #UpL1,d2            *
  571.         move.l    #UpR1,d1            *
  572.  
  573. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  574. *    次の変化点までの距離を求める。
  575. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  576. Wyle:        moveq.l    #0,d0                *┐
  577. @@:        addq.w    #1,d0                *│ビット数カウント
  578.         B_TEST                    *│
  579.         bne    @b                *┘
  580.  
  581.         moveq.l    #1,d3                *┐
  582.         lsl.l    d0,d3                *│なんとコメントしてよいやら
  583.         subq.l    #1,d3                *┘
  584.  
  585.         cmpi.w    #17,d0                *┐何ビット?
  586.         bcc    1f                *┘
  587.  
  588.         B_READ    d0,d0                *┐
  589.         and.l    d3,d0                *│ワードで読む
  590.         add.l    d0,d3                *│
  591.         SET_NM3                    *┘
  592.  
  593. 1:        move.l    d1,-(sp)        *
  594.         sub.w    a1,d0                *┐
  595.         B_READ    d0,d1                *│ロングワードで読む
  596.         B_READ    a1,d0                *│
  597.         swap    d1                *│
  598.         move.w    d0,d1                *│
  599.         and.l    d3,d1                *│
  600.         add.l    d1,d3                *│
  601.         move.l    (sp)+,d1        *
  602.         SET_NM3                    *┘
  603.  
  604. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  605. *        折り返し付き横塗り
  606. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  607. PicX_10:    sub.l    d4,d3                *
  608.  
  609.         bra    2f                *
  610. 1:        move.w    (a0),d0                *│2(8)
  611.         move.w    -2(a0,d0.w),(a0)+        *│4(18)
  612. 2:        dbra    d4,1b
  613.  
  614.         adda.w    DOWNOFS(a6),a0            *┐1段下がる
  615.         moveq.l    #0,d4                *│
  616.         move.w    PSIZE_X(a6),d4            *│
  617.         subq.w    #1,PSIZE_Y(a6)            *│
  618.         beq    PicX_ex                *│
  619.         cmp.l    d3,d4                *│
  620.         bcs    PicX_10                *│
  621.         sub.l    d3,d4                *┘
  622.  
  623. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  624. PicX_05:    subq.w    #1,d3
  625.         bcs    PicX_04
  626.  
  627.         bra    2f                *
  628. 1:        move.w    (a0),d0                *│2(8)
  629.         move.w    -2(a0,d0.w),(a0)+        *│4(18)
  630. 2:        dbra    d3,1b
  631.  
  632. PicX_04:    jmp    (a5)                *パレット取得へ
  633.  
  634. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  635. *        パレット取得
  636. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  637. PALsel_16:
  638.  
  639. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  640. PALsel_256:
  641.  
  642. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  643. PALsel65536:    B_READ    a1,d0                *16ビット読み込む
  644.  
  645.         move.w    d0,d0                *頭が1なら、テーブル番号
  646.         bmi    READfromTBL            *頭が0なら、色コード
  647.  
  648.         add.w    d0,d0                *新たに1ビット読み込んで
  649.         B_TEST                    *65536色データにする
  650.         beq    @f                *
  651.         addq.w    #1,d0                *
  652.  
  653. @@:        move.w    PR_BUF+2(a6,a3.w),a3        *┐テーブルにセットする
  654.         move.w    d0,PR_BUF(a6,a3.w)        *│
  655.         bra    chain                *┘
  656.  
  657. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  658. PALsel32768:    B_READ    a1,d0                *16ビット読み込む
  659.  
  660.         move.w    d0,d0                *頭が1なら、テーブル番号
  661.         bpl    SETtoTBL            *頭が0なら、色コード
  662.  
  663. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  664. READfromTBL:    lsr.w    #5,d0                *┐
  665.         andi.w    #127*8,d0            *┘d0.w = テーブル番号x8
  666.  
  667.         cmp.w    a3,d0                *
  668.         beq    @f                *
  669.  
  670.         move.l    PR_BUF+2(a6,d0.w),d3        *18    計122クロック
  671.         move.w    d3,a2                *04
  672.         swap    d3                *04
  673.         move.w    d3,PR_BUF+2(a6,a2.w)        *14
  674.         move.w    a2,PR_BUF+4(a6,d3.w)        *14
  675.         move.w    PR_BUF+2(a6,a3.w),d3        *14
  676.         move.w    d0,PR_BUF+2(a6,a3.w)        *14
  677.         move.w    d0,PR_BUF+4(a6,d3.w)        *14
  678.         swap    d3                *04
  679.         move.w    a3,d3                *04
  680.         move.l    d3,PR_BUF+2(a6,d0.w)        *18
  681.  
  682.         move.w    d0,a3
  683.  
  684. @@:        move.w    PR_BUF(a6,d0.w),d0        *1ドット書き込み
  685.  
  686.         B_FB    8
  687.         bra    chain
  688.  
  689. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  690. SETtoTBL:    add.w    d0,d0                *┐
  691.         move.w    PR_BUF+2(a6,a3.w),a3        *│テーブルにセットする
  692.         move.w    d0,PR_BUF(a6,a3.w)        *┘
  693.  
  694. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  695. *        連鎖処理
  696. *- - - -*- - - -*- - - -*- - - -*- - - -*- - - -*- - - -
  697. chain:        lea    (a0),a2                *
  698.         move.w    d0,(a0)+            * 1ドット描き込み
  699.  
  700.         B_TEST                    *┐連鎖の有無
  701.         dbne    d4,Wyle                *┘
  702.         beq.s    chain_ex            *┘
  703.  
  704. chain_next:    B_TEST                    *x
  705.         bne    C_1x
  706.         B_TEST                    *0x
  707.         bne    C_01
  708.         B_TEST                    *00x
  709.         dbne    d4,Wyle
  710.         beq.s    chain_ex
  711.  
  712.         B_TEST                    *001x
  713.         bne    1f
  714.  
  715.         lea    1024-4(a2),a2
  716.         move.w    #UpR2,(a2)            *0010:L2
  717.         bra    chain_next
  718.  
  719. 1:        lea    1024+4(a2),a2
  720.         move.w    #UpL2,(a2)            *0011:R2
  721.         bra    chain_next
  722.  
  723. C_01:        lea    1024-2(a2),a2
  724.         move.w    d1,(a2)                *01:L1
  725.         bra    chain_next
  726.  
  727. C_1x:        B_TEST                    *1x
  728.         bne    1f
  729.  
  730.         lea    1024(a2),a2
  731.         move.w    d5,(a2)                *10:C
  732.         bra    chain_next
  733.  
  734. 1:        lea    1024+2(a2),a2
  735.         move.w    d2,(a2)                *11:R1
  736.         bra    chain_next
  737.  
  738. chain_ex:    adda.w    DOWNOFS(a6),a0            *┐連鎖と横ループを抜けたあと
  739.         moveq.l    #0,d4                *│
  740.         move.w    PSIZE_X(a6),d4            *│
  741.         subq.w    #1,d4                *│
  742.         subq.w    #1,PSIZE_Y(a6)            *│
  743.         bne    Wyle                *│
  744. PicX_ex:    rts                    *┘
  745.